﻿package frEngine.math
{
    import baseEngine.basic.*;
    import baseEngine.system.*;
    import baseEngine.utils.*;
    import flash.geom.*;

    public class FrMathUtil extends Object
    {

        public function FrMathUtil()
        {
            return;
        }// end function

        public static function bezier3_fun3(param1:Vector3D, param2:Vector3D, param3:Vector3D, param4:Vector3D, param5:Number, param6:Vector3D) : void
        {
            var _loc_7:* = param1;
            var _loc_8:* = param2;
            var _loc_9:* = param4;
            var _loc_10:* = param3;
            var _loc_11:* = _loc_8.subtract(_loc_7);
            _loc_11.scaleBy(3);
            _loc_9 = _loc_9.subtract(_loc_8);
            _loc_9.scaleBy(3);
            _loc_9 = _loc_9.subtract(_loc_11);
            _loc_10 = _loc_10.subtract(_loc_7).subtract(_loc_11).subtract(_loc_9);
            _loc_8 = new Vector3D(param5, param5 * param5, param5 * param5 * param5);
            _loc_10.scaleBy(_loc_8.z);
            _loc_9.scaleBy(_loc_8.y);
            _loc_11.scaleBy(_loc_8.x);
            _loc_8 = _loc_10.add(_loc_9).add(_loc_11).add(_loc_7);
            param6.x = _loc_8.x;
            param6.y = _loc_8.y;
            param6.z = _loc_8.z;
            return;
        }// end function

        public static function fastGetInsertPos(param1:Array, param2:Object) : int
        {
            var _loc_3:* = param1.length;
            var _loc_4:int = 0;
            var _loc_5:int = -1;
            while (_loc_4 < _loc_3)
            {
                
                _loc_5 = _loc_4 + _loc_3 >>> 1;
                if (param1[_loc_5] == param2)
                {
                    break;
                }
                if (param2 > param1[_loc_5])
                {
                    _loc_4 = _loc_5 + 1;
                    continue;
                }
                _loc_3 = _loc_5 + 1;
            }
            return _loc_5;
        }// end function

        public static function fastGetInsertPos2(param1:Array, param2:Number, param3:String) : int
        {
            var _loc_7:Number = NaN;
            var _loc_4:* = param1.length;
            var _loc_5:int = 0;
            var _loc_6:int = -1;
            while (_loc_5 < _loc_4)
            {
                
                _loc_6 = _loc_5 + _loc_4 >>> 1;
                _loc_7 = param1[_loc_6][param3];
                if (_loc_7 == param2)
                {
                    break;
                }
                if (param2 > _loc_7)
                {
                    _loc_5 = _loc_6 + 1;
                    continue;
                }
                _loc_4 = _loc_6 + 1;
            }
            return _loc_6;
        }// end function

        public static function pointOnCubicBezier2(param1:Vector3D, param2:Vector3D, param3:Vector3D, param4:Number, param5:Vector3D) : void
        {
            var _loc_6:* = param4 * param4;
            var _loc_7:* = 1 - param4;
            var _loc_8:* = _loc_7 * _loc_7;
            var _loc_9:* = 2 * param4 * _loc_7;
            param5.x = param1.x * _loc_8 + param2.x * _loc_9 + param3.x * _loc_6;
            param5.y = param1.y * _loc_8 + param2.y * _loc_9 + param3.y * _loc_6;
            param5.z = param1.z * _loc_8 + param2.z * _loc_9 + param3.z * _loc_6;
            return;
        }// end function

        public static function bezier3_fun2(param1:Vector3D, param2:Vector3D, param3:Vector3D, param4:Vector3D, param5:Number, param6:Vector3D) : void
        {
            var _loc_7:* = param1.clone();
            var _loc_8:* = param2.clone();
            var _loc_9:* = param4.clone();
            var _loc_10:* = param3.clone();
            var _loc_11:* = 1 - param5;
            var _loc_12:* = new Vector3D(param5, param5 * param5, param5 * param5 * param5);
            var _loc_13:* = new Vector3D(_loc_11, _loc_11 * _loc_11, _loc_11 * _loc_11 * _loc_11);
            _loc_7.scaleBy(_loc_13.z);
            _loc_8.scaleBy(3 * _loc_12.x * _loc_13.y);
            _loc_9.scaleBy(3 * _loc_12.y * _loc_13.x);
            _loc_10.scaleBy(_loc_12.z);
            _loc_8 = _loc_7.add(_loc_8).add(_loc_9).add(_loc_10);
            param6.x = _loc_8.x;
            param6.y = _loc_8.y;
            param6.z = _loc_8.z;
            return;
        }// end function

        public static function bezier3_fun(param1:Vector3D, param2:Number, param3:Number, param4:Number, param5:Vector3D, param6:Number, param7:Number, param8:Number, param9:Number, param10:Vector3D) : void
        {
            var _loc_11:* = param1;
            var _loc_12:* = param5;
            var _loc_13:* = param9 * param9;
            var _loc_14:* = _loc_13 * param9;
            var _loc_15:* = 1 - param9;
            var _loc_16:* = _loc_15 * _loc_15;
            var _loc_17:* = _loc_16 * _loc_15;
            var _loc_18:* = 3 * param9 * _loc_16;
            var _loc_19:* = 3 * _loc_13 * _loc_15;
            param10.x = _loc_11.x * _loc_17 + param2 * _loc_18 + param6 * _loc_19 + _loc_12.x * _loc_14;
            param10.y = _loc_11.y * _loc_17 + param3 * _loc_18 + param7 * _loc_19 + _loc_12.y * _loc_14;
            param10.z = _loc_11.z * _loc_17 + param4 * _loc_18 + param8 * _loc_19 + _loc_12.z * _loc_14;
            return;
        }// end function

        public static function lineAndPlaneCrossPoint(param1:Vector3D, param2:Vector3D, param3:Vector3D, param4:Vector3D) : Vector3D
        {
            var _loc_5:* = param1.x - param2.x;
            var _loc_6:* = param1.y - param2.y;
            var _loc_7:* = param1.z - param2.z;
            var _loc_8:* = param3.subtract(param1);
            var _loc_9:* = _loc_5 * param4.x + _loc_6 * param4.y + _loc_7 * param4.z;
            var _loc_10:* = _loc_8.x * param4.x + _loc_8.y * param4.y + _loc_8.z * param4.z;
            var _loc_11:* = _loc_10 / _loc_9;
            var _loc_12:* = new Vector3D(_loc_11 * _loc_5 + param1.x, _loc_11 * _loc_6 + param1.y, _loc_11 * _loc_7 + param1.z);
            return _loc_12;
        }// end function

        public static function pointToLineDistance1(param1:Vector3D, param2:Vector3D, param3:Vector3D) : Number
        {
            var _loc_4:* = param2.subtract(param3);
            var _loc_5:* = param2.subtract(param1);
            var _loc_6:* = _loc_4.crossProduct(_loc_5);
            var _loc_7:* = _loc_4.crossProduct(_loc_6);
            _loc_7.normalize();
            return _loc_5.dotProduct(_loc_7);
        }// end function

        public static function pointToLineDistance2(param1:Vector3D, param2:Vector3D, param3:Vector3D) : Number
        {
            var _loc_4:* = param2.subtract(param1);
            var _loc_5:* = param3.crossProduct(_loc_4);
            var _loc_6:* = param3.crossProduct(_loc_5);
            _loc_6.normalize();
            return _loc_4.dotProduct(_loc_6);
        }// end function

        public static function rotate(param1:Point, param2:Number, param3:Point, param4:Point = null) : Point
        {
            var _loc_5:* = Math.PI / 180 * param2;
            if (!param4)
            {
                param4 = new Point();
            }
            var _loc_6:* = param3.x - param1.x;
            var _loc_7:* = param3.y - param1.y;
            param4.x = _loc_6 * Math.cos(_loc_5) - _loc_7 * Math.sin(_loc_5) + param1.x;
            param4.y = _loc_7 * Math.cos(_loc_5) + _loc_6 * Math.sin(_loc_5) + param1.y;
            return param4;
        }// end function

        public static function getTwoLineCrossPoints(param1:Vector3D, param2:Vector3D, param3:Vector3D, param4:Vector3D, param5:CrossLineInfo) : void
        {
            var _loc_6:* = param1.dotProduct(param3);
            if (_loc_6 > 0.99 || _loc_6 < -0.99)
            {
                param5.crossPoint1.x = param2.x;
                param5.crossPoint1.y = param2.y;
                param5.crossPoint1.z = param2.z;
                param5.crossPoint2.x = param4.x;
                param5.crossPoint2.y = param4.y;
                param5.crossPoint2.z = param4.z;
                return;
            }
            var _loc_7:* = param1.x;
            var _loc_8:* = param1.y;
            var _loc_9:* = param1.z;
            var _loc_10:* = param3.x;
            var _loc_11:* = param3.y;
            var _loc_12:* = param3.z;
            var _loc_13:* = param4.x - param2.x;
            var _loc_14:* = param4.y - param2.y;
            var _loc_15:* = param4.z - param2.z;
            var _loc_16:* = _loc_7 * _loc_7 + _loc_8 * _loc_8 + _loc_9 * _loc_9;
            var _loc_17:* = _loc_10 * _loc_10 + _loc_11 * _loc_11 + _loc_12 * _loc_12;
            var _loc_18:* = _loc_7 * _loc_10 + _loc_8 * _loc_11 + _loc_9 * _loc_12;
            var _loc_19:* = _loc_7 * _loc_13 + _loc_8 * _loc_14 + _loc_9 * _loc_15;
            var _loc_20:* = _loc_10 * _loc_13 + _loc_11 * _loc_14 + _loc_12 * _loc_15;
            var _loc_21:* = (_loc_19 * _loc_17 - _loc_20 * _loc_18) / (_loc_16 * _loc_17 - _loc_18 * _loc_18);
            var _loc_22:* = (_loc_20 * _loc_16 - _loc_18 * _loc_19) / (_loc_18 * _loc_18 - _loc_16 * _loc_17);
            param5.crossPoint1.x = _loc_21 * _loc_7 + param2.x;
            param5.crossPoint1.y = _loc_21 * _loc_8 + param2.y;
            param5.crossPoint1.z = _loc_21 * _loc_9 + param2.z;
            param5.crossPoint2.x = _loc_22 * _loc_10 + param4.x;
            param5.crossPoint2.y = _loc_22 * _loc_11 + param4.y;
            param5.crossPoint2.z = _loc_22 * _loc_12 + param4.z;
            return;
        }// end function

        public static function getVector3dByRate(param1:Vector3D, param2:Vector3D, param3:Number, param4:Vector3D = null) : Vector3D
        {
            var _loc_5:* = new Vector3D();
            param4 = new Vector3D();
            param4.x = param1.x + (param2.x - param1.x) * param3;
            param4.y = param1.y + (param2.y - param1.y) * param3;
            param4.z = param1.z + (param2.z - param1.z) * param3;
            return param4;
        }// end function

        public static function pointPlane(param1:Vector3D, param2:Vector3D, param3:Vector3D) : Number
        {
            return -(param1.dotProduct(param3) - param1.dotProduct(param2));
        }// end function

        public static function mousePlane(param1:Number, param2:Number, param3:Vector3D, param4:Vector3D) : Vector3D
        {
            var _loc_5:* = new Vector3D();
            var _loc_6:* = new Vector3D();
            var _loc_7:* = new Vector3D();
            Global3D.scene.camera.getPosition(false, _loc_5);
            Global3D.scene.camera.getPointDir(param1, param2, _loc_6);
            rayPlane(param4, param3, _loc_5, _loc_6, _loc_7);
            return _loc_7;
        }// end function

        public static function rayPlane(param1:Vector3D, param2:Vector3D, param3:Vector3D, param4:Vector3D, param5:Vector3D = null) : Number
        {
            var _loc_6:* = (-(param1.dotProduct(param3) - param1.dotProduct(param2))) / param1.dotProduct(param4);
            if (param5)
            {
                param5.x = param3.x + param4.x * _loc_6;
                param5.y = param3.y + param4.y * _loc_6;
                param5.z = param3.z + param4.z * _loc_6;
            }
            return _loc_6;
        }// end function

        public static function project2DPoint(param1:Vector3D, param2:Vector3D = null) : Vector3D
        {
            if (param2 == null)
            {
                param2 = new Vector3D();
            }
            param2.w = 1;
            var _loc_3:* = Global3D.scene;
            if (!_loc_3.viewPort)
            {
                return param2;
            }
            Matrix3DUtils.transformVector(_loc_3.camera.view, param1, param2);
            var _loc_4:* = _loc_3.viewPort.width / Global3D.camera.zoom / param2.z;
            param2.x = param2.x * _loc_4 + _loc_3.viewPort.width * 0.5 + _loc_3.viewPort.x;
            param2.y = (-param2.y) * _loc_4 + _loc_3.viewPort.height * 0.5 + _loc_3.viewPort.y;
            param2.z = 0;
            param2.w = _loc_4;
            return param2;
        }// end function

    }
}
